package com.ihr360.insurance.service;

import com.ihr360.commons.model.type.BenefitCategory;
import com.ihr360.commons.vo.PageData;
import com.ihr360.entity.StaffBankSalaryEntity;
import com.ihr360.insurance.entity.request.MemberPlanReq;
import com.ihr360.insurance.entity.request.StaffBenefitRequest;
import com.ihr360.insurance.entity.request.StaffLedgerRequest;
import com.ihr360.insurance.entity.vo.SingleStaffBenefitVo;
import com.ihr360.insurance.entity.vo.StaffBenefitEntity;
import com.ihr360.insurance.entity.vo.StaffBenefitVo;
import com.ihr360.insurance.model.dto.staff.StaffBenefit;
import com.ihr360.rest.service.SimpleRestService;

import java.util.List;

/**
 * @author Stone.Shi
 * @description 社保公积金数据服务
 * @date 2018-02-01 18:25:24.
 */
public interface StaffBenefitService extends SimpleRestService<StaffBenefit, Long> {

    /**
     * 获取指定方案的社保人数
     *
     * @param companyBenefitId
     * @param authStaffIds
     * @return
     */
    Integer getSocialInsuranceCount(Long companyBenefitId, List<String> authStaffIds);

    /**
     * 获取指定方案的公积金人数
     *
     * @param companyBenefitId
     * @param authStaffIds
     * @return
     */
    Integer getHouseFundCount(Long companyBenefitId, List<String> authStaffIds);

    /**
     * 获取公司已关联社保/公积金方案总人数
     *
     * @param companyId
     * @param category  SI/HF
     * @return
     */
    int getRelatedStaffCount(String companyId, BenefitCategory category, List<String> authStaffIds);

    /**
     * 获取公司未关联社保/公积金方案总人数 在职
     *
     * @param companyId
     * @param category  SI/HF
     * @return
     */
    int getUnRelatedStaffCount(String companyId, BenefitCategory category, List<String> authStaffIds);

    /**
     * 保存社保公积金数据,category指定主要的保存对象为社保还是公积金
     *  @param companyId
     * @param benefitVos
     * @param category
     * @param authStaffIds
     */
    void saveBenefits(String companyId, List<StaffBenefitVo> benefitVos, BenefitCategory category, List<String> authStaffIds);

    /**
     * 仅保存社保或者公积金数据
     *  @param companyId
     * @param singleBenefitVos
     * @param category
     * @param authStaffIds
     */
    void saveSingleBenefits(String companyId, List<SingleStaffBenefitVo> singleBenefitVos, BenefitCategory category, List<String> authStaffIds);

    /**
     * 从方案中删除关联的员工：
     * 仅从员工数据中删除社保或者公积金数据
     * 删除时：是将对应员工数据中的方案id置为null
     *  @param companyId
     * @param singleBenefitVos
     * @param category
     * @param authStaffIds
     */
    void deleteSingleBenefits(String companyId, List<SingleStaffBenefitVo> singleBenefitVos, BenefitCategory category, List<String> authStaffIds);

    /**
     * 获取指定员工的数据
     *
     * @param companyId
     * @param staffIds
     * @return
     */
    List<StaffBenefitVo> getAllStaffBenefitInclude(String companyId, List<String> staffIds);

    /**
     * 获取可添加到社保公积金台账中的员工数据
     *
     * @param companyId
     * @param userId
     * @param authStaffIds
     * @param req
     * @return
     */
    PageData<StaffBenefitVo> getCanAddToLedgerStaffs(String companyId, String userId,
                                                     List<String> authStaffIds, StaffLedgerRequest req);

    /**
     * 获取未关联社保公积金方案的员工
     *
     * @param companyId
     * @param authStaffIds 有访问权限的全部id列表
     *@param req  @return
     */
    PageData<StaffBenefitVo> getUnrelatedStaffs(String companyId, List<String> authStaffIds, StaffBenefitRequest req);

    /**
     * 获取staffIds范围内的符合条件的员工社保公积金数据信息
     *
     * @param companyId
     * @param authStaffIds 有访问权限的全部id列表
     * @param req
     * @return
     */
    PageData<StaffBenefitVo> getList(String companyId, List<String> authStaffIds, StaffBenefitRequest req);

    /**
     * 获取增员人员
     *
     * @param companyId
     * @param authStaffIds
     * @param req
     * @return
     */
    PageData<StaffBenefitVo> getIncreaseMember(String companyId, List<String> authStaffIds, MemberPlanReq req);

    /**
     * 获取减员人员
     *
     * @param companyId
     * @param authStaffIds
     * @param req
     * @return
     */
    PageData<StaffBenefitVo> getDecreaseMember(String companyId, List<String> authStaffIds, MemberPlanReq req);

    //***************************************花名册编辑社保公积金数据相关功能********************************************/

    /**
     * 花名册编辑社保公积金功能，获取员工社保公积金数据
     *
     * @param companyId
     * @param staffId
     * @return
     */
    StaffBenefitEntity getStaffBenefitInfo(String companyId, String staffId);

    /**
     * 花名册保存员工社保公积金数据接口
     *
     * @param companyId
     * @param entity
     */
    void saveStaffBenefitInfo(String companyId, StaffBenefitEntity entity);

    /**
     * 花名册离职最后缴纳月数据保存
     *
     * @param companyId
     * @param entity
     */
    void saveStaffBenefitEndMonth(String companyId, StaffBenefitEntity entity);

    void saveAllInsurance(String companyId, List<StaffBankSalaryEntity> staffBankSalaryEntityList);

}
